<?PHP
/**
 * OpenStation
 *
 * @CLI
 * @Application : App.class.php
 * @Encode : 65001 Unicode ( UTF-8 NO BOM )
 * @Description : App 应用调度类( CLI )
 * @Author : HK <hkyyang@gmail.com>
 */

class App {

    /**
     * run 方法，应用运行入口
     *
     * @static
     * @access public
     * @param $
     * @return void
     */
    static public function run() {
        self :: get_request();
        self :: execute();
    }

    /**
     * execute 方法，执行一个应用
     *
     * @static
     * @access private
     * @param $
     * @return void
     */
    static private function execute() {
        // 当前行为类名称
        Cache :: copy( 'SERVER.ACTION_SHORT', 'SERVER.CLASS', 'Action', '.=' );

        if( count( Cache :: get( 'SERVER.REQUEST' ) ) ) {
            // 设置本次执行方法，第一个请求参数为方法名，所以这里出栈
            Cache :: set( 'SERVER.METHOD', Cache :: shift( 'SERVER.REQUEST' ) );
        } else {
            // 当没有请求参数时，使用默认方法
            Cache :: set( 'SERVER.METHOD', 'index' );
        }

        // 载入项目Action
        import( Cache :: get( 'SERVER.ACTION_FILE_NAME' ) );
        // 获取项目当前行为实例
        $action = get_instance_of( Cache :: get( 'SERVER.CLASS' ) );

        // 行为方法别名
        if( Cache :: type( '@.ACTION_ALIAS.' . Cache :: get( 'SERVER.ACTION_SHORT' ), 'array' ) ) {
            if( ! is_null( Cache :: get( '@.ACTION_ALIAS.' . Cache :: get( 'SERVER.ACTION_SHORT' ) . '.' . Cache :: get( 'SERVER.METHOD' ) ) ) ) {
                // 包含参数
                if( Cache :: type( '@.ACTION_ALIAS.' . Cache :: get( 'SERVER.ACTION_SHORT' ) . '.' . Cache :: get( 'SERVER.METHOD' ), 'array' ) ) {
                    Cache :: set( 'SERVER.TARGET_METHOD', key( Cache :: get( '@.ACTION_ALIAS.' . Cache :: get( 'SERVER.ACTION_SHORT' ) . '.' . Cache :: get( 'SERVER.METHOD' ) ) ) );
                    Cache :: set( 'SERVER.METHOD_ATTR', Cache :: get( '@.ACTION_ALIAS.' . Cache :: get( 'SERVER.ACTION_SHORT' ) . '.' . Cache :: get( 'SERVER.METHOD' ) . '.' . Cache :: get( 'SERVER.TARGET_METHOD' ) ) );
                } else {
                    Cache :: copy( '@.ACTION_ALIAS.' . Cache :: get( 'SERVER.ACTION_SHORT' ) . '.' . Cache :: get( 'SERVER.METHOD' ), 'SERVER.TARGET_METHOD' );
                }
            }
        }

        // 优先别名目标方法
        if( method_exists( $action, Cache :: get( 'SERVER.TARGET_METHOD' ) ) ) {
        // 方法验证, 如果不存在
        } else if( ! method_exists( $action, Cache :: get( 'SERVER.METHOD' ) ) ) {
            exit( date( '[c]' ) . 'ERROR: ACTION METHOD NOT FOUND!' );
        }

        // 执行当前行为的构造方法
        $action -> __initial();

        // 执行当前行为方法
        if( ! is_null( Cache :: get( 'SERVER.TARGET_METHOD' ) ) ) {
            // 有参数的别名方法
            if( ! is_null( Cache :: get( 'SERVER.METHOD_ATTR' ) ) ) {
                Cache :: call( 'SERVER.TARGET_METHOD', Cache :: get( 'SERVER.METHOD_ATTR' ), $action );
            } else {
                Cache :: call( 'SERVER.TARGET_METHOD', NULL, $action );
            }
        } else {
            Cache :: call( 'SERVER.METHOD', NULL, $action );
        }

        // 执行当前行为的析构方法
        $action -> __finish();

        // 错误和警告
        if( Cache :: type( 'SERVER.ERROR', 'array' ) ) {
            Log :: error( Cache :: get( 'SERVER.ERROR' ) );
        }

    }

    /**
     * 获取本次应用的请求参数
     *
     * @static
     * @access private
     * @param $
     * @return void
     */
    static private function get_request() {
        Cache :: set( 'SERVER.REQUEST', $_SERVER[ 'argv' ] );
        Cache :: shift( 'SERVER.REQUEST' );
    }

}
?>